# -*- Mode: Python -*-
# vim: filetype=python
#
# This work is licensed under the terms of the GNU GPL, version 2 or later.
# See the COPYING file in the top-level directory.
# SPDX-License-Identifier: GPL-2.0-or-later

##
# = PCI
##

##
# @PciMemoryRange:
#
# A PCI device memory region
#
# @base: the starting address (guest physical)
#
# @limit: the ending address (guest physical)
#
# Since: 0.14
##
{ 'struct': 'PciMemoryRange', 'data': {'base': 'int', 'limit': 'int'} }

##
# @PciMemoryRegion:
#
# Information about a PCI device I/O region.
#
# @bar: the index of the Base Address Register for this region
#
# @type: - 'io' if the region is a PIO region
#        - 'memory' if the region is a MMIO region
#
# @size: memory size
#
# @prefetch: if @type is 'memory', true if the memory is prefetchable
#
# @mem_type_64: if @type is 'memory', true if the BAR is 64-bit
#
# Since: 0.14
##
{ 'struct': 'PciMemoryRegion',
  'data': {'bar': 'int', 'type': 'str', 'address': 'int', 'size': 'int',
           '*prefetch': 'bool', '*mem_type_64': 'bool' } }

##
# @PciBusInfo:
#
# Information about a bus of a PCI Bridge device
#
# @number: primary bus interface number.  This should be the number of the
#          bus the device resides on.
#
# @secondary: secondary bus interface number.  This is the number of the
#             main bus for the bridge
#
# @subordinate: This is the highest number bus that resides below the
#               bridge.
#
# @io_range: The PIO range for all devices on this bridge
#
# @memory_range: The MMIO range for all devices on this bridge
#
# @prefetchable_range: The range of prefetchable MMIO for all devices on
#                      this bridge
#
# Since: 2.4
##
{ 'struct': 'PciBusInfo',
  'data': {'number': 'int', 'secondary': 'int', 'subordinate': 'int',
           'io_range': 'PciMemoryRange',
           'memory_range': 'PciMemoryRange',
           'prefetchable_range': 'PciMemoryRange' } }

##
# @PciBridgeInfo:
#
# Information about a PCI Bridge device
#
# @bus: information about the bus the device resides on
#
# @devices: a list of @PciDeviceInfo for each device on this bridge
#
# Since: 0.14
##
{ 'struct': 'PciBridgeInfo',
  'data': {'bus': 'PciBusInfo', '*devices': ['PciDeviceInfo']} }

##
# @PciDeviceClass:
#
# Information about the Class of a PCI device
#
# @desc: a string description of the device's class
#
# @class: the class code of the device
#
# Since: 2.4
##
{ 'struct': 'PciDeviceClass',
  'data': {'*desc': 'str', 'class': 'int'} }

##
# @PciDeviceId:
#
# Information about the Id of a PCI device
#
# @device: the PCI device id
#
# @vendor: the PCI vendor id
#
# @subsystem: the PCI subsystem id (since 3.1)
#
# @subsystem-vendor: the PCI subsystem vendor id (since 3.1)
#
# Since: 2.4
##
{ 'struct': 'PciDeviceId',
  'data': {'device': 'int', 'vendor': 'int', '*subsystem': 'int',
            '*subsystem-vendor': 'int'} }

##
# @PciDeviceInfo:
#
# Information about a PCI device
#
# @bus: the bus number of the device
#
# @slot: the slot the device is located in
#
# @function: the function of the slot used by the device
#
# @class_info: the class of the device
#
# @id: the PCI device id
#
# @irq: if an IRQ is assigned to the device, the IRQ number
#
# @irq_pin: the IRQ pin, zero means no IRQ (since 5.1)
#
# @qdev_id: the device name of the PCI device
#
# @pci_bridge: if the device is a PCI bridge, the bridge information
#
# @regions: a list of the PCI I/O regions associated with the device
#
# Notes: the contents of @class_info.desc are not stable and should only be
#        treated as informational.
#
# Since: 0.14
##
{ 'struct': 'PciDeviceInfo',
  'data': {'bus': 'int', 'slot': 'int', 'function': 'int',
           'class_info': 'PciDeviceClass', 'id': 'PciDeviceId',
           '*irq': 'int', 'irq_pin': 'int', 'qdev_id': 'str',
           '*pci_bridge': 'PciBridgeInfo', 'regions': ['PciMemoryRegion'] }}

##
# @PciInfo:
#
# Information about a PCI bus
#
# @bus: the bus index
#
# @devices: a list of devices on this bus
#
# Since: 0.14
##
{ 'struct': 'PciInfo', 'data': {'bus': 'int', 'devices': ['PciDeviceInfo']} }

##
# @query-pci:
#
# Return information about the PCI bus topology of the guest.
#
# Returns: a list of @PciInfo for each PCI bus. Each bus is
#          represented by a json-object, which has a key with a json-array of
#          all PCI devices attached to it. Each device is represented by a
#          json-object.
#
# Since: 0.14
#
# Example:
#
# -> { "execute": "query-pci" }
# <- { "return": [
#          {
#             "bus": 0,
#             "devices": [
#                {
#                   "bus": 0,
#                   "qdev_id": "",
#                   "slot": 0,
#                   "class_info": {
#                      "class": 1536,
#                      "desc": "Host bridge"
#                   },
#                   "id": {
#                      "device": 32902,
#                      "vendor": 4663
#                   },
#                   "function": 0,
#                   "regions": [
#                   ]
#                },
#                {
#                   "bus": 0,
#                   "qdev_id": "",
#                   "slot": 1,
#                   "class_info": {
#                      "class": 1537,
#                      "desc": "ISA bridge"
#                   },
#                   "id": {
#                      "device": 32902,
#                      "vendor": 28672
#                   },
#                   "function": 0,
#                   "regions": [
#                   ]
#                },
#                {
#                   "bus": 0,
#                   "qdev_id": "",
#                   "slot": 1,
#                   "class_info": {
#                      "class": 257,
#                      "desc": "IDE controller"
#                   },
#                   "id": {
#                      "device": 32902,
#                      "vendor": 28688
#                   },
#                   "function": 1,
#                   "regions": [
#                      {
#                         "bar": 4,
#                         "size": 16,
#                         "address": 49152,
#                         "type": "io"
#                      }
#                   ]
#                },
#                {
#                   "bus": 0,
#                   "qdev_id": "",
#                   "slot": 2,
#                   "class_info": {
#                      "class": 768,
#                      "desc": "VGA controller"
#                   },
#                   "id": {
#                      "device": 4115,
#                      "vendor": 184
#                   },
#                   "function": 0,
#                   "regions": [
#                      {
#                         "prefetch": true,
#                         "mem_type_64": false,
#                         "bar": 0,
#                         "size": 33554432,
#                         "address": 4026531840,
#                         "type": "memory"
#                      },
#                      {
#                         "prefetch": false,
#                         "mem_type_64": false,
#                         "bar": 1,
#                         "size": 4096,
#                         "address": 4060086272,
#                         "type": "memory"
#                      },
#                      {
#                         "prefetch": false,
#                         "mem_type_64": false,
#                         "bar": 6,
#                         "size": 65536,
#                         "address": -1,
#                         "type": "memory"
#                      }
#                   ]
#                },
#                {
#                   "bus": 0,
#                   "qdev_id": "",
#                   "irq": 11,
#                   "slot": 4,
#                   "class_info": {
#                      "class": 1280,
#                      "desc": "RAM controller"
#                   },
#                   "id": {
#                      "device": 6900,
#                      "vendor": 4098
#                   },
#                   "function": 0,
#                   "regions": [
#                      {
#                         "bar": 0,
#                         "size": 32,
#                         "address": 49280,
#                         "type": "io"
#                      }
#                   ]
#                }
#             ]
#          }
#       ]
#    }
#
# Note: This example has been shortened as the real response is too long.
#
##
{ 'command': 'query-pci', 'returns': ['PciInfo'] }
